﻿// udp协议.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <Windows.h>

#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")

/*
udp协议：
            服务器                         客户端
        0.确定协议版本信息              0.确定协议版本信息
        1.创建socket                    1.创建socket
        2.确定服务器的协议地址族        2.获取服务器的协议地址族
        3.绑定
        4.通信                          3.通信
        5.关闭socket                    4.关闭socket
        6.清理协议版本信息              5.清理协议版本信息


通信载体：
    TCP：    SOCK_STREAM            数据流          好比沙子一点一点的流出
    UCP：    SOCK_DGRAM             数据报文        好比沙子一袋子一袋子的搬出

*/

int main()
{
    //0.确定协议版本信息；
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (2 != LOBYTE(wsaData.wVersion) ||
        2 != HIBYTE(wsaData.wVersion))
    {
        printf("确定协议版本信息失败%d\n", GetLastError());
        return -1;
    }
    printf("确定协议版本信息成功\n");


    //1.创建socket
    SOCKET serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (SOCKET_ERROR == serverSocket)
    {
        printf("创建socket失败:%d\n", GetLastError());

        //6.清理协议版本信息：
        WSACleanup();


        return -1;
    }
    printf("创建socket成功\n");


    //2.确定服务器的协议地址族：
    SOCKADDR_IN sAddr = { 0 };
    sAddr.sin_family = AF_INET;
    sAddr.sin_addr.S_un.S_addr = inet_addr("10.133.98.104");
    sAddr.sin_port = htons(6666);


    //3.绑定
    int r = bind(serverSocket, (sockaddr*)&sAddr, sizeof(sAddr));
    if (-1 == r)
    {
        printf("绑定失败:%d\n", GetLastError());

        //5.关闭socket：
        closesocket(serverSocket);

        //6.清理协议版本信息：
        WSACleanup();

        return -1;
    }
    printf("绑定成功\n");

    //4.通信
    char buff[256];

    while (1)
    {
        r = recv(serverSocket, buff, 255, NULL);
        if (r > 0)
        {
            buff[r] = 0;
            printf("客户端发来%s\n", buff);


        }
    }


    //5.关闭socket
    closesocket(serverSocket);


    //6.清理协议版本信息：
    WSACleanup();

    return 0;
}

